Communication entre une application java et un sgbdr
(mais le client peut être
unique)
Application client-Serveur
De nombreuses applications
fonctionnent selon un environnement client/serveur, cela signifie que des machines clientes (des machines
faisant partie du réseau)
contactent un serveur, une
machine généralement très puissante en terme de capacités d'entrée-sortie, qui
leur fournit des services. Ici,
le serveur héberge la base de données.
Dans une application de type
client-serveur de données :
Pilote JDBC (Java Database
Connectivity)
Pour se connecter à une base
de données à partir d’un programme java, il faut un pilote jdbc :
« logiciel » qui a connaissance des méthodes d’accès à votre base de
données.
Pour obtenir plus
d’informations sur les pilotes jdbc : http://java.sun.com/jdbc/drivers.html
Accès aux données
Tous les objets et les
méthodes relatifs aux bases de données sont présents dans le package java.sql,
il est donc indispensable d'importer java.sql.*
L’accès à une base de
données doit être effectué en 5 étapes :
Ce pilote est disponible sous
forme de classe java mais il est généralement compacté à l’intérieur d’un
package de type .jar. Il respecte
l’interface Driver définie par Java.
La 1ère étape
consiste donc à charger cette classe. Pour cela, il faut utiliser la méthode
suivante :
Class
Class
|
|
|
|
L’utilisation de cette
méthode peut lever une exception de type : ClassNotFoundException, il
convient donc de placer cette instruction dans un bloc sécurisé.
Exemple :
String nomPilote = " org.postgresql.Driver" ; // ou String nomPilote = "org.hsqldb.jdbcDriver"; // driver Hypersonic SQL try { Class.forName(nomPilote); } catch (ClassNotFoundException e) { System.out.println("problème
chargement driver "+e); } |
Il est préférable de ne
démarrer la connexion qu’une seule fois, au démarrage de l’application.
Une fois le driver chargé,
nous pouvons obtenir une connexion via la méthode suivante :
Class
DriverManager
|
|
|
|
|
|
Remarques :
« jdbc : nomPilote : cheminBase ou
alias »
Exemple 1 :
try { Connection connexion =
DriverManager.getConnection("jdbc:postgresql://igdb/exemple","ig","demo")
; } catch (SQLException e) { System.out.println("problème lors
de la connexion à la bd "+e); } |
Exemple 2 :
final String url =
"jdbc:hsqldb:/TonerExpress"; final String user="sa"; final String password=""; Connection con = null; try {
con = DriverManager.getConnection(url, user, password); } catch (SQLException e) { System.out.println("problème lors
de la connexion à la bd "+e); } |
Toutes les instructions de
requête sont susceptibles de lever des exceptions de type SQLException. Il faut
donc toutes les placer dans des blocs sécurisés.
L’exécution d’une requête
s’effectue via les méthodes suivantes:
Interface
Statement
|
|
|
|
|
|
Remarque : on distingue 2 types de requêtes :
Pour utiliser ces méthodes,
vous devez donc utiliser un objet de type Statement. Pour créer un objet de
cette classe, vous devez utiliser :
Interface
Connection
|
|
|
Exemple :
Statement stLienBd = connexion.createStatement() ; |
Exemple :
String requete =
"SELECT * FROM CARTOUCHE"; Resultset resultat = stLienBd.executeQuery(requete); |
Ou
bien :
Resultset resultat =
stLienBd.executeQuery("select * from cartouche"); |
Exemple 1 :
String requete = "update cartouche set prixcartoucheneuve =
prixcartoucheneuve * 1.03"; stLienBd.executeUpdate(requete); |
Exemple 2 :
req = "INSERT INTO
IMPRIMANTE VALUES("; req +=
Integer.toString(refmax+1); req += " , '" +
this.ref.getText()+"','L',
'" + this.des.getText() +"')"; int nb =
stat.executeUpdate(req); |
La
méthode executeUpdate() retourne un objet de type ResultSet.
Un
objet de type ReSultSet peut contenir un ou plusieurs enregistrements. Afin de
passer d’un enregistrement à l’autre, il faut utiliser la méthode next().
Pour
récupérer les données contenues dans ces enregistrements, il faut utiliser les
méthodes getString(), getInt() en précisant soit le nom de la colonne soit le
numéro de la colonne de la donnée que l’on veut récupérer !
Interface
ResultSet
|
|
|
|
|
|
|
|
|
|
Exemple 1 :
String requete = "select * from ngclient"; Resultset resultat = stLienBd.executeQuery(requete); while ( resultat.next() ) {
System.out.println("Numero" + resultat.getInt(1) );
System.out.println("Nom" + resultat.getString(“nom”) );
System.out.println("Prenom" + resultat.getString(3) ); } |
Exemple 2 :
Statement stat = maConnexion.createStatement(); req = "SELECT * FROM IMPRIMANTE"; ResultSet rs = stat.executeQuery(req); TypeImprimante arg3; while (rs.next()) { String arg2 =
rs.getString(2); if
(rs.getString(3).equals("L")) arg3 = l; else arg3 = j; String arg4 =
rs.getString(4); lesImprimantes.add(new
Imprimante(arg2,arg3,arg4,new TabCartouches())); } |
La
méthode executeUpdate() retourne le nombre d’enregistrements impactés par
l’instruction exécutée.
Exemple :
String requete = "delete
* from ngclient"; int nbSuppression =
stLienBd.executeUpdate(requete);
System.out.println(nbSuppression
+ “ enregistrements ont été supprimés”); |
Exemple 2 :
req = "INSERT INTO
IMPRIMANTE VALUES("; req +=
Integer.toString(refmax+1); req += " , '" +
this.ref.getText()+"','L',
'" + this.des.getText() +"')"; int nb =
stat.executeUpdate(req); if (nb==1)
JOptionPane.showMessageDialog(this,"Imprimante ajoutée"); |
La fermeture de la
connexion ne se fait qu’une seule fois, lors de la fermeture de l’application.
Mais il ne faut pas l’oublier. Sans cela, vous risquez d’utiliser des
ressources dont vous n’avez plus utilité… et, si vous êtes en mode
mono-utilisateur, vous ne pourrez plus relancer votre application qui vous dira
que la base de données est en cours d’utilisation.
Pour fermez explicitement une
connexion, vous devez utiliser la méthode suivante :
Interface
Connection
|
|
|
|
Exemple :
connexion.close(); |
Ou
Exemple :
public void close(){ try { if (con != null) { con.close(); }
} catch (Exception e) {
System.err.println(e); } } |